# -*- coding: utf-8 -*-
# Create your views here.
from django.shortcuts import render_to_response
from restaurante.models import *
import impressao.views
import impressao.models
from django.views.decorators.csrf import csrf_exempt
from django.contrib.auth.models import User
from django.http import HttpResponseRedirect, HttpResponse
from datetime import datetime, date, timedelta
from django.views.decorators.cache import never_cache

from django.contrib.auth.decorators import login_required, permission_required
from django.template import RequestContext

# para ter acesso à variável user
from django.contrib.auth.context_processors import auth
from django.core.context_processors import PermWrapper
from django.core import serializers

from django.contrib.auth import logout

from django.db.models import Q

def gravar_evento(usuario, descricao,  pedido = None):
    evento = Evento(usuario=usuario, descricao=descricao, data = datetime.now(), pedido=pedido)
    evento.save()

def cabecalho_parcial():
    saida = 'Restaurante Aqui Agora!'.center(impressao.views.COLUNAS) + '\n'
    saida += 'Rua Elpídio Ribeiro da Silva, 366'.center(impressao.views.COLUNAS) + '\n'
    saida += 'Campo dos Velhos - Sobral-CE - CEP: 62.030-070'.center(impressao.views.COLUNAS) + '\n'
    saida += 'FONE: (88) 9217.7082 / 8801.8182'.center(impressao.views.COLUNAS) + '\n'
    return saida

def cabecalho(cabecalho = None):
    if cabecalho == None:
        return cabecalho_parcial()
    else:
        return cabecalho.center(impressao.views.COLUNAS)

def rodape_principal():
    saida = 'Simplesmente o melhor.'.center(impressao.views.COLUNAS) + '\n'
    saida += 'Volte sempre!'.center(impressao.views.COLUNAS)
    return saida

def rodape(rodape = None):
    if rodape == None:
        return rodape_principal()
    else:
        return rodape.center(impressao.views.COLUNAS)

def sobre(request):
    return render_to_response('sobre.html', locals(),
        context_instance=RequestContext(request))

def ajuda(request):
    return render_to_response('ajuda.html', locals(),
        context_instance=RequestContext(request))

@never_cache
@login_required
def mesas(request):
    mensagem = False
    aviso = False
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']
        
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('abertura.html', locals(),
        context_instance=RequestContext(request))

    lista_mesas = Mesa.objects.filter(tipo = 1)
    pedidos = Pedido.objects.filter(aberto=1)
    
    for mesa in lista_mesas:
        pedido = pedidos.filter(mesa=mesa.id)
        if len(pedido) != 0:
            mesa.pedido = pedido[0]
            mesa.itens = Item.objects.filter(pedido_id=mesa.pedido.id, estado = 1).count()
            
            #Calculando desconto
            if mesa.pedido.desconto != '':
                mesa.pedido.total = (float(mesa.pedido.total) - float(mesa.pedido.desconto))
                
            #calculando valor pago
            pagamento_parcial = Pagamento_parcial.objects.filter(pedido_id = mesa.pedido.id)
            valor_pago = 0.0
            for pagamento in pagamento_parcial:
                valor_pago += float(pagamento.valor)
            
            mesa.pedido.total = float(mesa.pedido.total) - valor_pago
            mesa.pedido.total = str("%.2f" % round(mesa.pedido.total, 3)).replace('.', ',')
    
    header = 'Mesas'
    return render_to_response('mesa.html',locals(),
        context_instance=RequestContext(request))

@never_cache
@login_required
def entregas(request):
    mensagem = False
    aviso = False
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']
        
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('abertura.html', locals(),
        context_instance=RequestContext(request))

    lista_mesas = Mesa.objects.filter(tipo = 2)
    pedidos = Pedido.objects.filter(aberto=1)
    
    for mesa in lista_mesas:
        pedido = pedidos.filter(mesa=mesa.id)
        if len(pedido) != 0:
            mesa.pedido = pedido[0]
            mesa.itens = Item.objects.filter(pedido_id=mesa.pedido.id, estado = 1).count()
    
    header = 'Entregas'
    return render_to_response('mesa.html',locals(),
        context_instance=RequestContext(request))

@never_cache
@login_required
def balcao(request):
    mensagem = False
    aviso = False
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']
        
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('abertura.html', locals(),
        context_instance=RequestContext(request))

    lista_mesas = Mesa.objects.filter(tipo = 3)
    pedidos = Pedido.objects.filter(aberto=1)
    
    for mesa in lista_mesas:
        pedido = pedidos.filter(mesa=mesa.id)
        if len(pedido) != 0:
            mesa.pedido = pedido[0]
            mesa.itens = Item.objects.filter(pedido_id=mesa.pedido.id, estado = 1).count()
    
    header = 'Balcão'
    return render_to_response('mesa.html',locals(),
        context_instance=RequestContext(request))

@login_required
@csrf_exempt
def pedido_cliente(request, pedido_id):
    
    if request.POST.has_key('busca'):
        clientes = None
        q = request.POST['q'].strip()
        
        if len(q) > 0:
            clientes = Cliente.objects.filter(Q(nome__icontains = q) | Q(cpf = q))
            clientes = list(clientes)
            
            telefones = Telefone.objects.filter(numero__icontains = q)
            
            for i in telefones:
                clientes += list(Cliente.objects.filter(nome__icontains = i.cliente))
                
            enderecos = Endereco.objects.filter(Q(rua__icontains = q) | Q(cidade__icontains = q) | Q(referencia__icontains = q) | Q(cep__icontains = q))
            for i in enderecos:
                clientes += list(Cliente.objects.filter(nome__icontains = i.cliente))
            
            for i in clientes:
                while clientes.count(i) > 1:
                    clientes.remove(i)
            
            for cliente in clientes:
                cliente.telefones = Telefone.objects.filter(cliente_id = cliente.id)
                cliente.enderecos = Endereco.objects.filter(cliente_id = cliente.id)
    
        if clientes == None or len(clientes) == 0:
            request.session['mensagem'] = u'Não encontramos clientes com a busca por \"' + q + '\".'
    
        
    mensagem = False
    aviso = False
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']
        
    return render_to_response('pedido_cliente.html', locals(),
        context_instance=RequestContext(request))

@login_required
def pedido_cliente_associar(request, pedido_id, cliente_id):
    if Pedido.objects.filter(id = pedido_id).count() > 0:
        pedido = Pedido.objects.get(id = pedido_id)
        
        if Cliente.objects.filter(id = cliente_id):
            pedido.cliente = Cliente.objects.get(id = cliente_id)
            pedido.save()
            
            gravar_evento(request.user, "Cliente associado", pedido)
            
            return HttpResponseRedirect('/pedido/' + str(pedido.mesa_id))
            
        else:
            request.session['aviso'] = 'Cliente não existe'
            return HttpResponseRedirect('/')
    else:
        request.session['aviso'] = 'Pedido não existe'
        return HttpResponseRedirect('/')
    
@never_cache
@login_required
def pedido(request, mesa_id):
    pedido = Pedido.objects.filter(mesa_id=mesa_id, aberto=1)

    try:
        mesa = Mesa.objects.get(id=mesa_id)
        if len(pedido) == 0:
            pedido = Pedido(mesa_id = mesa_id, total = 0, aberto = 1, data_aberto=datetime.now(), data_fechado = None, usuario = request.user)
            pedido.save()
            
            gravar_evento(request.user, "Abriu pedido", pedido)
            
        else:
            pedido = pedido[0]
    except:
        mensagem = 'Mesa informada não existe'
        return render_to_response('aviso.html', locals(),
        context_instance=RequestContext(request))
        
    lista_itens = Item.objects.filter(pedido_id=pedido.id)
    itens = Item.objects.filter(pedido_id=pedido.id, estado__gt = 0).count()
    
    lista_abertos = Item.objects.filter(pedido_id = pedido.id, estado = 1)
    abertos = lista_abertos.count()
    
    
    for item in lista_itens:
        item.valor_total = item.quantidade * item.produto.preco_de_venda
    
    total = float(pedido.total)
    
    #Calculando desconto
    if pedido.desconto != '':
        total = (float(pedido.total) - float(pedido.desconto))
        
    #calculando 
    pagamento_parcial = Pagamento_parcial.objects.filter(pedido_id = pedido.id)
    valor_pago = 0.0
    for pagamento in pagamento_parcial:
        valor_pago += float(pagamento.valor)
    
    total -= valor_pago
    total = round(total, 3)
    
    mensagem = False
    aviso = False
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']
    
    total = str('%.2f' % total).replace('.',',')
    pedido.total = str(pedido.total).replace('.',',')
    return render_to_response('pedido.html', locals(),
        context_instance=RequestContext(request))

@login_required
def pedido_parcial(request, mesa_id):
    pedido = Pedido.objects.get(mesa_id=mesa_id, aberto=1)
    itens = Item.objects.filter(pedido_id=pedido.id)
    
    gravar_evento(request.user, "Imprimiu Parcial", pedido)
    
    saida = datetime.now().strftime('%d/%m/%Y - %H:%M:%S') + '\n'
    saida += (str(pedido) + ' ' + unicode(pedido.mesa) + '. Entrada: '+ str(pedido.data_aberto.strftime('%H:%M:%S'))).ljust(impressao.views.COLUNAS) + '\n'
    saida += '-'* impressao.views.COLUNAS + '\n'
    saida +=  "    Descricao                      Qt Unit  Total\n"
    saida += '-' * impressao.views.COLUNAS + '\n'

    i = 0
    for item in itens:
        i += 1
        if item.estado != 0:
            if item.estado == 3:
                saida += str(i).zfill(3).rjust(3) + ' ' + item.produto.descricao_impressao.ljust(30) + ' ' + "--".zfill(2).ljust(2) + ' ' + "----".ljust(5) +' ' + "----".rjust(6) + '\n'
            else:
                saida += str(i).zfill(3).rjust(3) + ' ' + item.produto.descricao_impressao.ljust(30) + ' ' + str(item.quantidade).zfill(2).ljust(2) + ' ' + str(item.produto.preco_de_venda).replace('.', ',').ljust(5) +' ' + str( item.quantidade * item.produto.preco_de_venda ).replace('.', ',').rjust(6) + '\n'
    
    saida += '-' * impressao.views.COLUNAS + '\n'
    
#    saida += ("TOTAL R$ " + str(pedido.total)).rjust(impressao.views.COLUNAS)
    
    saida += ("TOTAL R$ ").rjust(40) + str(pedido.total).rjust(10)
    
    #calculando valor pago
    pagamento_parcial = Pagamento_parcial.objects.filter(pedido_id = pedido.id)
    valor_pago = 0.0
    for pagamento in pagamento_parcial:
        valor_pago += float(pagamento.valor)
    
    saida += '\n'
    
    saida += ('Valor pago RS '.rjust(40)) + ('%.2f' % valor_pago).rjust(10)
    
    # gambiarra begin
    if pedido.mesa.tipo == 1:
        dezporcento = float(pedido.total) * 0.1
    else:
        dezporcento = 0.0

    if pedido.desconto == '':
        pedido.desconto = 0
    
    pedido.total = float(pedido.total) - valor_pago
    # gambiarra end
    
    if pedido.desconto != '':
        pedido.desconto = float('%.2f' % float(pedido.desconto))
        total = float('%.2f' % (float(pedido.total) - float(pedido.desconto)))
        
        saida += '\n'
        
#        saida += ('Desconto R$ %.2f' % pedido.desconto).rjust(impressao.views.COLUNAS) + '\n'
        saida += ('Desconto RS '.rjust(40)) + ('%.2f' % pedido.desconto).rjust(10) + '\n'
          
#        saida += ('VALOR FINAL R$ %.2f' % total).rjust(impressao.views.COLUNAS)
        
        # DEZPORCENTO
        saida += ('Taxa de servico RS '.rjust(40)) + ('%.2f' % dezporcento).rjust(10) + '\n'
        
        saida += '-' * impressao.views.COLUNAS + '\n'
        saida += ('VALOR FINAL R$ ').rjust(40) + ('%.2f' % (total + dezporcento)).rjust(10)
    
    
    impressao.views.imprime(
        saida,
        impressao.models.Impressora.objects.get(nome="Principal"),
        cabecalho_parcial(),
        rodape_principal()
    )
#    impressao.imprime(saida, impressao.IMPRESSORA_PRINCIPAL)
    
    return HttpResponseRedirect('/pedido/' + mesa_id) 

# listar produtos separados por categorias
@login_required
def categorias(request, mesa_id):
    lista_categorias = Categoria.objects.all()
    
    mensagem = False
    aviso = False
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']
        
    for categoria in lista_categorias:
        categoria.lista_produtos = Produto.objects.filter(categoria_id = categoria.id)

    return render_to_response('produtos.html', locals(),
        context_instance=RequestContext(request))

@csrf_exempt
@login_required
def adicionar_item(request):
    mesa_id = request.POST['mesa_id']
    produto_id = request.POST['produto_id']
    quantidade = request.POST['quantidade']
    meda_id = int(mesa_id)
    produto_id = int(produto_id)
    quantidade = int(quantidade)
    
    if int(quantidade) == 0 :
        request.session['aviso'] = "Item NÃO incluído."
        return HttpResponseRedirect('/produtos/' + mesa_id)
    else:
        pedido = Pedido.objects.get(mesa_id=mesa_id, aberto=1)

        produto = Produto.objects.get(id=produto_id)
        if produto.quantidade < int(quantidade):
            request.session['aviso'] = u"Item NÃO incluído. Quantidade em estoque: "+ str(produto.quantidade)
            return HttpResponseRedirect('/produtos/' + mesa_id)
        produto.quantidade-=int(quantidade)
        produto.save()
        item = Item(pedido_id=pedido.id, produto_id=produto_id, quantidade=quantidade, data = datetime.now())
        item.save()
        
        gravar_evento(request.user, u"Adicionou Item. %s - %dx %s" % (item.produto.codigo, item.quantidade, item), pedido)
        

        pedido.total = float(pedido.total) + (int(item.quantidade) * float(item.produto.preco_de_venda))

        pedido.save()
        
        if int(item.quantidade) == 1:
            request.session['mensagem'] = u"Item incluído."
        else:
            request.session['mensagem'] = str(item.quantidade) + u" Itens incluídos."
        
        return HttpResponseRedirect('/produtos/' + mesa_id)

@login_required
@csrf_exempt
def adicionar_item_id(request):
    
    if request.POST.has_key('validar') and request.POST['validar'] == '1':
        mesa_id = int(request.POST['mesa_id'])
        quantidade = request.POST['quantidade']
        codigo = request.POST['codigo']
        
        try:
            produto = Produto.objects.get(codigo=codigo)
        except:
            request.session['aviso'] = 'Código de produto não encontrado'
            return HttpResponseRedirect('/pedido/' + str(mesa_id))
            
        if quantidade.isdigit():
            quantidade = int(quantidade)
            
            if quantidade > 0:
                pedido = Pedido.objects.get(mesa_id=mesa_id, aberto=1)
                
                if produto.quantidade < int(quantidade):
                    request.session['aviso'] = u"Item NÃO incluído. Quantidade em estoque: "+ str(produto.quantidade)
                    return HttpResponseRedirect('/pedido/' + str(mesa_id))
                
                produto.quantidade -= int(quantidade)
                produto.save()
                
                item = Item(pedido_id=pedido.id, produto_id=produto.id, quantidade=quantidade, data = datetime.now())
                item.save()
                
                pedido.total = float(pedido.total) + (int(item.quantidade) * float(item.produto.preco_de_venda))
                pedido.save()
                
                gravar_evento(request.user, u"Adicionou item pelo código. %s - %dx %s" % (item.produto.codigo, item.quantidade, item), pedido)
                
                if int(item.quantidade) == 1:
                    request.session['mensagem'] = u"Item incluído."
                else:
                    request.session['mensagem'] = str(item.quantidade) + u" Itens incluídos."
                    
            else:
                request.session['aviso'] = 'Quantidade inválida'
            
        else:
            request.session['aviso'] = 'Quantidade inválida'
        
        return HttpResponseRedirect('/pedido/' + str(mesa_id))
    else:
        return HttpResponseRedirect('/')
    
@login_required
def pedido_processar(request, mesa_id):
    pedido = Pedido.objects.get(mesa_id = mesa_id, aberto=1)
    itens = Item.objects.filter(pedido_id=pedido.id, estado=1)
    setores = Setor.objects.all()
    
    lista_imprimir = {}

    for setor in setores:
        lista_imprimir[setor.nome_setor] = []

    for item in itens:
        lista_imprimir[item.produto.setor.nome_setor].append(item)
        item.estado = 2
        item.save()
        
        gravar_evento(request.user, "Confirmou Pedido", pedido)
        

    for lista in lista_imprimir:
        alista = lista_imprimir[lista]
        if len(alista) > 0:
            setor = alista[0].produto.setor
            
            if setor.destino != None:
                saida = datetime.now().strftime('%d/%m/%Y - %H:%M:%S') + '\n'
                saida += (str(pedido.mesa) + '. Entrada: '+ str(pedido.data_aberto.strftime('%H:%M:%S'))).ljust(impressao.views.COLUNAS) + '\n'
                saida += '-'* impressao.views.COLUNAS + '\n'
                saida += "Quant Descricao                      Cod    Valor\n"
                saida += '-' * impressao.views.COLUNAS + '\n'
                for item in alista:
                    saida += str(item.quantidade).zfill(2).ljust(5) + ' ' + item.produto.descricao_impressao.ljust(30) + ' ' + str(item.produto.codigo).replace('.', ',').ljust(5) +' ' + str( item.quantidade * item.produto.preco_de_venda ).replace('.', ',').rjust(6) + '\n'
                    
                    if item.observacao != None and item.observacao != "":
                        saida += 'Obs.: ' + item.observacao + '\n\n'
                
                impressao.views.imprime(saida, setor.destino, cabecalho(setor.nome_setor))

    return HttpResponseRedirect('/pedido/' + str(mesa_id))


@never_cache
@login_required
def produtos(request):
    lista_produtos = Produto.objects.all()
    return render_to_response('produtos.html', locals(),
        context_instance=RequestContext(request))

@login_required
def logout_view(request):
    logout(request)
    return HttpResponseRedirect('/')

@login_required
#@permission_required('restaurante.delete_item')
def item_excluir(request, mesa_id, item_id):
    item = Item.objects.get(id=item_id)
    
    if item.estado != 0:
        item.estado = 0
        item.produto.quantidade += item.quantidade
        item.produto.save()
        item.pedido.total = float(item.pedido.total) - (float(item.produto.preco_de_venda) * float(item.quantidade) )
        item.pedido.save()
        item.save()
        
        gravar_evento(request.user, "Removeu Item %d - %dx %s" % (item.id, item.quantidade, item), item.pedido)
    
    return HttpResponseRedirect('/pedido/' + mesa_id)

@csrf_exempt
@login_required
def pedido_pessoas(request, mesa_id):
    pedido = Pedido.objects.get(mesa_id=mesa_id, aberto=1)
    
    if pedido.numero_pessoas == int(request.POST['numero_pessoas']):
        request.session['aviso'] = "O número de pessoas não foi modificado"
    else:
        pedido.numero_pessoas = int(request.POST['numero_pessoas'])
        pedido.save()
        request.session['mensagem'] = "Número de pessoas atualizado"
    
    return HttpResponseRedirect('/pedido/' + mesa_id)

@login_required
@permission_required('restaurante.change_pedido')
def pedido_fechar(request, mesa_id):
    if Pedido.objects.filter(mesa_id=mesa_id, aberto=1).count() > 0:
        pedido = Pedido.objects.get(mesa_id=mesa_id, aberto=1)

        # se mesa tipo ENTREGA
        if pedido.mesa.tipo == 2:
            try:
                valor = float(request.POST["valor"].replace(',','.'))
                
                if valor <= 0:
                    request.session["aviso"] = "Pagamento deve ser maior que Zero"
                    return HttpResponseRedirect("/pedido/"+ str(pedido.mesa_id))

                if pedido.desconto == '':
                    pedido.desconto = 0.0
                    
                if valor < (float(pedido.total) - float(pedido.desconto)):
                    request.session["aviso"] = "Pagamento menor que o total"
                    return HttpResponseRedirect("/pedido/"+ str(pedido.mesa_id))
                
                troco = valor - (float(pedido.total) - float(pedido.desconto))
                gravar_evento(request.user, "Pagamento", pedido)

                pedido.aberto = 0
                pedido.data_fechado = datetime.now()
                pedido.save()
            
                gravar_evento(request.user, "Fechou Pedido", pedido)
            
                enderecos = Endereco.objects.filter(cliente_id = pedido.cliente_id)
                return render_to_response('pedido_entrega_confirmar_endereco.html', locals(),
                    context_instance=RequestContext(request))

            except:
                request.session["aviso"] = "Valor inválido"
            return HttpResponseRedirect("/pedido/" + str(pedido.mesa_id))
        
        pedido.aberto=0
        pedido.data_fechado = datetime.now()
        pedido.save()
        gravar_evento(request.user, "Fechou Pedido", pedido)

    return HttpResponseRedirect('/')

@csrf_exempt
@login_required
def pedido_entrega_confirmar_endereco(request):
    troco = float(request.POST['troco'].replace(',', '.'))
    endereco_id = int(request.POST['endereco_id'])
    
    if endereco_id > 0:
        endereco = Endereco.objects.get(id = endereco_id)
    else:
        endereco = request.POST['endereco']
    
    pedido_id = request.POST['pedido_id']
    
    pedido = Pedido.objects.get(id = pedido_id)
    itens = Item.objects.filter(pedido_id=pedido.id)
    
    gravar_evento(request.user, "Imprimiu Entrega", pedido)
    
    saida = datetime.now().strftime('%d/%m/%Y - %H:%M:%S') + '\n'
    saida += (str(pedido) + ' ' + str(pedido.mesa) + '. Entrada: '+ str(pedido.data_aberto.strftime('%H:%M:%S'))).ljust(impressao.views.COLUNAS) + '\n'
    saida += '-'* impressao.views.COLUNAS + '\n'
    saida +=  "    Descricao                      Qt Unit  Total\n"
    saida += '-' * impressao.views.COLUNAS + '\n'
    
    i = 0
    for item in itens:
        i += 1
        if item.estado != 0:
            if item.estado == 3:
                saida += str(i).zfill(3).rjust(3) + ' ' + item.produto.descricao_impressao.ljust(30) + ' ' + "--".zfill(2).ljust(2) + ' ' + "----".replace('.', ',').ljust(5) +' ' + "----".rjust(6) + '\n'
            else:
                saida += str(i).zfill(3).rjust(3) + ' ' + item.produto.descricao_impressao.ljust(30) + ' ' + str(item.quantidade).zfill(2).ljust(2) + ' ' + str(item.produto.preco_de_venda).replace('.', ',').ljust(5) +' ' + str( item.quantidade * item.produto.preco_de_venda ).replace('.', ',').rjust(6) + '\n'
    
    saida += '-' * impressao.views.COLUNAS + '\n'
    
#    saida += ("TOTAL R$ " + str(pedido.total)).rjust(impressao.views.COLUNAS)
    
    saida += ("TOTAL R$ ").rjust(40) + str(pedido.total).rjust(10)
    
    
    if pedido.desconto != '':
        pedido.desconto = float('%.2f' % float(pedido.desconto))
        total = float('%.2f' % (float(pedido.total) - float(pedido.desconto)))
        
        saida += '\n'
        
#        saida += ('Desconto R$ %.2f' % pedido.desconto).rjust(impressao.views.COLUNAS) + '\n'
        saida += ('Desconto RS '.rjust(40)) + ('%.2f' % pedido.desconto).rjust(10) + '\n'  
#        saida += ('VALOR FINAL R$ %.2f' % total).rjust(impressao.views.COLUNAS)
        
        saida += ('VALOR FINAL R$ ').rjust(40) + ('%.2f' % (total)).rjust(10)
        
    saida += '\n' +  '-' * impressao.views.COLUNAS + '\n'
    saida += ('Valor Pago R$ ').rjust(40) + ('%.2f' % (total + troco)).rjust(10) + '\n'
    saida += ('Troco R$ ').rjust(40) + ('%.2f' % (troco)).rjust(10)

    saida += '\n' +  '-' * impressao.views.COLUNAS + '\n'
    
    saida += 'Dados do cliente'.center(impressao.views.COLUNAS) + '\n'
    
    cliente = None
    if pedido.cliente:
        cliente = Cliente.objects.get(id = pedido.cliente_id)
    
    if cliente:
        saida += cliente.nome.center(impressao.views.COLUNAS) + '\n\n'
        
        telefones = Telefone.objects.filter(cliente_id = cliente.id)
        if telefones.count() > 0:
            for telefone in telefones:
                saida += unicode(telefone) + '\n'
            saida += '\n'
    
    saida += unicode(endereco) + '\n'
    
    impressao.views.imprime(
        saida,
        impressao.models.Impressora.objects.get(nome="Principal"),
        cabecalho_parcial(),
        rodape_principal()
    )
    
    request.session['mensagem'] = 'Pedido impresso'
    return HttpResponseRedirect('/')

@login_required
@csrf_exempt
def relatorio(request):
    if not request.user.is_superuser:
        request.session['aviso'] = 'Área restrita'
        return HttpResponseRedirect('/') 
    
    if Dia_funcionamento.objects.all().count() == 0:
        request.session['aviso'] = "Nenhuma data encontrada"
        return HttpResponseRedirect('/')
    
    # buscar datas iniciais e finais
    inicio = Dia_funcionamento.objects.get(id=1).aberto
    fim = datetime.now()
    
    hoje = datetime.today()
    
    anos = range(inicio.year, fim.year + 1)
    anos.reverse()
    
    meses = {
        1: 'Janeiro',
        2: 'Fevereiro',
        3: 'Março',
        4: 'Abril',
        5: 'Maio',
        6: 'Junho',
        7: 'Julho',
        8: 'Agosto',
        9: 'Setembro',
        10: 'Outubro',
        11: 'Novembro',
        12: 'Dezembro'
    }
    
    days = range(1, 32)
    
    if request.POST.has_key('busca') and request.POST['busca'] == '1':
        dia = request.POST['dia']
        mes = request.POST['mes']
        ano = request.POST['ano']
        
        data = date(int(ano), int(mes), int(dia))
        
        if request.POST['evento'].strip() != '':
            evento = request.POST['evento'].strip()
            dias = Dia_funcionamento.objects.filter(Q(evento__icontains=evento)|(Q(aberto__gt=data)&Q(aberto__lte=data+timedelta(1)))).order_by('-id')
        else:
            dias = Dia_funcionamento.objects.filter(Q(aberto__gt=data)&Q(aberto__lte=data+timedelta(1))).order_by('-id')
    else:
        dias = Dia_funcionamento.objects.all().order_by('-id')
    # Mostra todos os caixas abertos e fechados
#    dias = Dia_funcionamento.objects.all().order_by('-id')
    return render_to_response('relatorio.html',locals(),
        context_instance=RequestContext(request))
#    try:
#        dia = Dia_funcionamento.objects.get(fechado=None)
#    except:
#        request.session['aviso'] = "Caixa não aberto"
#        return HttpResponseRedirect('/')
#        
#    lista_pedidos = Pedido.objects.filter(data_aberto__gte=dia.aberto)
#    return render_to_response('relatorio.html',locals())

@login_required
@csrf_exempt
def abrir_caixa(request):
    if request.POST.has_key('evento'):
        evento = request.POST['evento'].strip()
        
        if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        
            dia = Dia_funcionamento(aberto=datetime.now(), fechado=None, evento=evento)
            dia.save()
            
            gravar_evento(request.user, "Abriu Caixa")

    return HttpResponseRedirect('/')

@login_required
@csrf_exempt
@permission_required('restaurante.change_pedido')
def fechar_caixa(request):
    if request.POST.has_key('validar') and request.POST['validar']=='1' :
        if Dia_funcionamento.objects.filter(fechado=None).count() > 0:
            
            # Verificar se há pedidos em aberto
            pedido = Pedido.objects.filter(aberto=1)
            if pedido.count() > 0:
                request.session['aviso'] = 'Há pedido(s) em aberto. Para encerrar o caixa é necessário fechar todos os pedidos'
                return HttpResponseRedirect('/')
            
            pedido = None
            
            # imprimir total apurado do dia
            dia = Dia_funcionamento.objects.get(fechado=None)
            pedidos = Pedido.objects.filter(data_aberto__gt=dia.aberto)
            
            mesas = Mesa.objects.all()
            total_mesa = {}
            
            for mesa in mesas:
                total_mesa[mesa.id] = 0.0
            
            # fazer total a cada 10
            total_mesa_10 = {}
            total_entrega = 0.0
            total_balcao = 0.0
            
            # inicializar gambiarras
            # 100 mesas
            for i in range(10):
                total_mesa_10[i+1] = 0.0
            # finalizar iniciar gambiarras
            
            total = 0.0
            
            for pedido in pedidos:
                if pedido.desconto == '':
                    pedido.desconto = 0.0
                
                # total_mesa[pedido.mesa_id] += (float(pedido.total) - float(pedido.desconto))
                
                if pedido.mesa.tipo == 1:
                    total_mesa_10[ ((int(pedido.mesa.id) - 1) / 10) + 1 ] = float(total_mesa_10[ ((int(pedido.mesa.id) - 1) / 10) + 1 ]) + (float(pedido.total) - float(pedido.desconto))
                elif pedido.mesa.tipo == 2:
                    total_entrega = float(total_entrega) + (float(pedido.total) - float(pedido.desconto))
                elif pedido.mesa.tipo == 3:
                    total_balcao = float(total_balcao) + (float(pedido.total) - float(pedido.desconto))
                
                total += (float(pedido.total) - float(pedido.desconto))
            
            # imprime
            saida = ""
            if dia.evento != '':
                saida += dia.evento + '\n'
            
            # inclui total de mesas
#            for mesa in mesas:
#                if total_mesa[mesa.id] > 0:
#                    saida += str(mesa) + " - R$ " + ("%.2f" % total_mesa[mesa.id]).replace('.', ',') + '\n'
            
            # inicio gambiarra
            saida += 'Total das mesas\n'
            
            for i in range(10):
                saida += 'Mesas %.3d a %.3d - R$ %.2f\n' % (i*10 + 1, i*10 + 10,  total_mesa_10[i+1])
            
            saida += '\nEntregas - R$ %.2f\n' % (total_entrega)
            saida += '\nBalcao   - R$ %.2f\n' % (total_balcao)
            # fim gambiarra
            
            saida += '\nTotal apurado do dia: R$ %.2f' % total 
            
            dia.fechado = datetime.now()
            dia.save()
            
            gravar_evento(request.user, "Fechou Caixa")
            
            impressao.views.imprime(saida, impressao.views.PRINCIPAL, cabecalho('Fechamento do caixa'), rodape('Aberto: ' + dia.aberto.strftime("%d/%m/%Y - %H:%M:%S") + '\nFechado: ' + dia.fechado.strftime("%d/%m/%Y - %H:%M:%S")))
            
            # mensagem
            request.session['mensagem'] = 'Caixa fechado com sucesso'
            
    return logout_view(request)

@login_required
def relatorio_dia(request, dia_id):
    if not request.user.is_superuser:
        request.session['aviso'] = 'Área restrita'
        return HttpResponseRedirect('/')
    
    dia = Dia_funcionamento.objects.get(id=dia_id)
    
    total = 0.0
    desconto = 0.0
    valor_final = 0.0
    numero_pessoas = 0
    
    if dia.fechado == None:
        dia.fechado = datetime.now()
        pedidos_abertos = Pedido.objects.filter(data_aberto__gte = dia.aberto, data_fechado=None)
        
        for pedido in pedidos_abertos:
            pedido.valor_final = float(pedido.total)
            if pedido.desconto != '':
                pedido.valor_final -= float(pedido.desconto)
            else:
                pedido.desconto = 0
            
            total += float(pedido.total)
            desconto += float(pedido.desconto)
            valor_final += float(pedido.valor_final)
            numero_pessoas += pedido.numero_pessoas
            
            pedido.desconto = ("%.2f" % float(pedido.desconto)).replace('.', ',')
            pedido.valor_final = ("%.2f" % pedido.valor_final).replace('.', ',')
    
    pedidos_fechados = Pedido.objects.filter(data_aberto__gte = dia.aberto, data_fechado__lt=dia.fechado)
    for pedido in pedidos_fechados:
        pedido.valor_final = float(pedido.total)
        if pedido.desconto != '':
            pedido.valor_final -= float(pedido.desconto)
        else:
            pedido.desconto = 0
        
        total += float(pedido.total)
        desconto += float(pedido.desconto)
        valor_final += float(pedido.valor_final)
        numero_pessoas += pedido.numero_pessoas
            
        pedido.desconto = ("%.2f" % float(pedido.desconto)).replace('.', ',')
        pedido.valor_final = ("%.2f" % pedido.valor_final).replace('.', ',')
    
    total = ("%.2f" % total).replace('.', ',')
    desconto = ("%.2f" % desconto).replace('.', ',')
    valor_final = ("%.2f" % valor_final).replace('.', ',')
    
    return render_to_response('relatorio_pedido.html', locals(),
        context_instance=RequestContext(request))

@login_required
def preparar_metade(request, pedido_id):
    
    if Pedido.objects.filter(id = pedido_id ).count() > 0:
        pedido = Pedido.objects.get(id = pedido_id)
        itens = Item.objects.filter(pedido = pedido, estado = 1)

        if itens.count() > 1:
            quantidade = itens.count()
            
            sabores = datetime.now().strftime('%d/%m/%Y - %H:%M:%S') + '\n'
            sabores += (str(pedido) + ' ' + str(pedido.mesa) + '. Entrada: '+ str(pedido.data_aberto.strftime('%H:%M:%S'))).ljust(impressao.views.COLUNAS) + '\n\n'
            
            sabores += str(quantidade) + " Sabores\n\n"
            

            maior_item = itens[0]
            #sabores += "1/" + str(quantidade) + " " + str(maior_item.produto.descricao_impressao) + "\n"
            for item in itens:
                if (float(maior_item.produto.preco_de_venda) < float(item.produto.preco_de_venda)) :
                    maior_item = item
                
                sabores += "1/" + str(quantidade) + " " + str(item.produto.descricao_impressao) + "\n"
                
                if item.observacao != None and item.observacao != "":
                    sabores += 'Obs.: ' + item.observacao + '\n\n'
                
                pedido.total = float(pedido.total) - float(item.produto.preco_de_venda)
                pedido.save()
                
                item.estado = 3
                item.save()
                # gravar_evento(request.user, u"Parte menor valor removida. %s - %dx %s" % (item.produto.codigo, item.quantidade, item), pedido)

            pedido.total = float(pedido.total) + float(maior_item.produto.preco_de_venda)
            pedido.save()
            
            maior_item.estado=2
            maior_item.save()
            gravar_evento(request.user, u"Parte MAIOR VALOR PROCESSADA para metade. Cód. %s - %dx %s" % (item.produto.codigo, item.quantidade, item), pedido)

            impressao.views.imprime(sabores, maior_item.produto.setor.destino, cabecalho(maior_item.produto.setor.nome_setor))
        else:
            pass

    else:
        request.session["aviso"] = "O pedido não existe"

    return HttpResponseRedirect("/pedido/" + str(pedido.mesa_id) )

@login_required
def relatorio_pedido(request, pedido_id):
    if not request.user.is_superuser:
        request.session['aviso'] = 'Área restrita'
        return HttpResponseRedirect('/')
    
    pedido = Pedido.objects.get(id = pedido_id)
    itens = Item.objects.filter(pedido_id = pedido_id)
    
    return render_to_response('relatorio_pedido_item.html', locals(),
        context_instance=RequestContext(request))

@login_required
@csrf_exempt
@permission_required('restaurante.add_pagamento_parcial')
def pagamento_parcial(request):
    pedido_id = request.POST["pedido_id"]
    valor = request.POST["valor"].replace(',','.')
    if Pedido.objects.filter(id = pedido_id, aberto = 1).count() > 0:
        pedido = Pedido.objects.get(id=pedido_id)
        try:
            valor = float(valor)
            
            if valor <= 0:
                request.session["aviso"] = "Pagamento deve ser maior que Zero"
                return HttpResponseRedirect("/pedido/"+ str(pedido.mesa_id))
            if pedido.desconto == '':
                pedido.desconto = 0.0
                
            pagamento_parcial = Pagamento_parcial.objects.filter(pedido_id = pedido.id)
            valor_pago = 0.0
            for pagamento in pagamento_parcial:
                valor_pago += float(pagamento.valor)
                
            if valor > (float(pedido.total) - float(pedido.desconto) - valor_pago):
                request.session["aviso"] = "Pagamento maior que o total"
                return HttpResponseRedirect("/pedido/"+ str(pedido.mesa_id))
            pagamento = Pagamento_parcial(pedido=pedido, valor=valor, data=datetime.now())
            pagamento.save()
            gravar_evento(request.user, "Pagamento parcial", pedido)
        except:
            request.session["aviso"] = "Valor inválido"
        return HttpResponseRedirect("/pedido/" + str(pedido.mesa_id))
    request.session["aviso"] = "Pedido inválido"
    return HttpResponseRedirect("/")

@login_required
@csrf_exempt
@permission_required('restaurante.add_pagamento_parcial')
def pagamento_entrega(request):
    pedido_id = request.POST["pedido_id"]
    valor = request.POST["valor"].replace(',','.')
    if Pedido.objects.filter(id = pedido_id, aberto = 1).count() > 0:
        pedido = Pedido.objects.get(id=pedido_id)
        try:
            valor = float(valor)
            
            if valor <= 0:
                request.session["aviso"] = "Pagamento deve ser maior que Zero"
                return HttpResponseRedirect("/pedido/"+ str(pedido.mesa_id))

            if pedido.desconto == '':
                pedido.desconto = 0.0
                
            if valor < (float(pedido.total) - float(pedido.desconto)):
                request.session["aviso"] = "Pagamento menor que o total"
                return HttpResponseRedirect("/pedido/"+ str(pedido.mesa_id))
            
            troco = valor - (float(pedido.total) - float(pedido.desconto))
            gravar_evento(request.user, "Pagamento", pedido)
            return HttpResponseRedirect('/pedido/fechar/' + str(pedido.mesa_id))
        except:
            request.session["aviso"] = "Valor inválido"
        return HttpResponseRedirect("/pedido/" + str(pedido.mesa_id))
    request.session["aviso"] = "Pedido inválido"
    return HttpResponseRedirect("/")

@login_required
def pedido_entrega(request):
    # Exibir lista de pedidos sem mesa e em aberto
    pedidos = Pedido.objects.filter(aberto = 1, mesa = None)
    
    return render_to_response('pedido_entrega.html', locals(),
        context_instance=RequestContext(request))


@login_required
def pedido_entrega_novo(request):
    # Exibir lista de pedidos sem mesa e em aberto
    
#    pedido = Pedido(total=0, aberto=1, data_aberto=datetime.now(), desconto = "", )
    
    return render_to_response('pedido_entrega_novo.html', locals(),
        context_instance=RequestContext(request))

@login_required
def pedido_item_observacao(request):
    
    if request.is_ajax():
        
        if request.POST.has_key('item_id') and request.POST.has_key('observacao'):
    
            item_id = int(request.POST['item_id'])
            observacao = request.POST['observacao']
            
            if Item.objects.filter(id = item_id).count() > 0:
                item = Item.objects.get(id = item_id)
                item.observacao = observacao
                item.save()
    
#    format = 'json'
#    mimetype = 'application/javascript'
#    
#    data = serializers.serialize(format, item)
#    return HttpResponse(data, mimetype)
    return HttpResponse(None)

@csrf_exempt
@login_required
@permission_required('restaurante.change_pedido')
def pedido_alterar_mesa(request, pedido_id):
    mensagem = False
    aviso = False
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']
        
    if Pedido.objects.filter(id = pedido_id).count() > 0:
        pedido = Pedido.objects.get(id = pedido_id)
        
        pedidos_abertos = Pedido.objects.filter(aberto = 1)
        mesas = list(Mesa.objects.all())
        
        for p in pedidos_abertos:
            if pedido.mesa != p.mesa:
                mesas.remove(p.mesa)
        
        if request.POST.has_key('validar'):
            if int(request.POST['validar']) == 1:
                try:
                    mesa_id = int(request.POST['mesa_id'])
                    if Mesa.objects.filter(id = mesa_id).count() > 0:
                        mesa = Mesa.objects.get(id = mesa_id)
                        if pedido.mesa_id != mesa_id and Pedido.objects.filter(mesa_id = mesa.id, aberto = 1).count() > 0:
                            request.session['aviso'] = 'Mesa já está ocupada'
                        else:
                            gravar_evento(request.user, "Mudou de %s para %s" % (pedido.mesa, mesa), pedido)
                            pedido.mesa = mesa
                            pedido.save()
                            return HttpResponseRedirect('/pedido/' + str(pedido.mesa_id))
                    else:
                        request.session['aviso'] = u'Mesa \"' + request.POST['mesa_id'] + u'\" não existe'
                        return HttpResponseRedirect('/pedido/' + str(pedido.mesa_id))
                except:
                    request.session['aviso'] = u'Mesa \"' + request.POST['mesa_id'] + u'\" não existe'
                    return HttpResponseRedirect('/pedido/' + str(pedido.mesa_id))
        
        return render_to_response('pedido_alterar_mesa.html', locals(),
            context_instance=RequestContext(request))
    else:
        request.session['aviso'] = 'Pedido não existe'
        
    return HttpResponseRedirect('/pedido/' + str(pedido.mesa_id))